import { contextBridge } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'

// 通过 contextBridge.exposeInMainWorld() 方法将 electronAPI 暴露给渲染进程
const api = {
  //  send是一个同步方法，通过 ipcRenderer.send() 方法将消息发送给主进程
  send: (channel, data) => {
    // 白名单 限制渲染进程可以调用的方法
    const validChannels = ['toMain']
    // 如果渲染进程调用了不在白名单中的方法，则抛出错误
    if (validChannels.includes(channel)) {
      // 对外暴露的方法，通过 ipcRenderer.send() 方法将消息发送给主进程
      window.ipcRenderer.send(channel, data)
    }
  },
  // receive是一个异步方法，通过回调函数接收主进程发送过来的消息
  // channel是主进程发送过来的消息名称，func是回调函数
  receive: (channel, func) => {
    // 白名单 限制渲染进程可以调用的方法
    const validChannels = ['fromMain']
    // 如果渲染进程调用了不在白名单中的方法，则抛出错误
    if (validChannels.includes(channel)) {
      // 对外暴露的方法，通过 ipcRenderer.on() 方法监听主进程发送过来的消息
      window.ipcRenderer.on(channel, (event, ...args) => func(...args))
    }
  }
}

// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
// just add to the DOM global.
// 判断是否开启了上下文隔离，如果开启了，则使用 contextBridge.exposeInMainWorld() 方法将 electronAPI 暴露给渲染进程
if (process.contextIsolated) {
  try {
    // 
    contextBridge.exposeInMainWorld('electron', electronAPI)
    contextBridge.exposeInMainWorld('api', api)
  } catch (error) {
    console.error(error)
  }
} else {
  window.electron = electronAPI
  window.api = api
}
